POJ 1258
Agri-Net
http://poj.org/problem?id=1258;
两种算法 Prim Kruskal.
先说Prim
初始化 权值,随便一个顶点做起点,为0 其它的为最大值。
找到权值最小的顶点,且没有加入集合。
把顶点权值加到结果,把定点加入集合。
暴力枚举 顶点连接的所有的边,更新所有能够连接上顶点的权值。
重复前3步,直到所有点全部加入集合。
以上图就是 首先找到的是 0节点 一开始权值是0,所以res +=0;然后暴力所有能够连接的点就是 1,和2, 然后更新 mincost[2]=min(INF,2),结果等于2;同理 mincost[1]=10;
其它点的权值不变。 然后又开始找找到 2 顶点,然后暴力所有点,这次更新的就是3 4 5顶点。然后不断重复就行了
最后连接起来的树是这个样子的。
下面是代码
1 | #include<iostream> |
接下来是Kruskal 代码
这个算法其实和Prim 算法差距不大,这个是直接把边排序
找到最小的边
判断边的两个节点是不是连接到同一颗树上,是跳过,不是连接两个顶点的根节点,结果加上边。
重复上面两步,直到连接N-1条边,因为N个顶点要N-1条边就能连接起来。
对于这个图,首先就找到(2,3 )这条边连起来,然后就是(4 5),然后(0 2),这时候有2棵树
(0 2 3 )和(4 5)然后接着连 (2 5)(5 6 )(1 4)就全部连接上了
代码
1 | #include<iostream> |